package com.william.jdbcplus.core.condition.criterion;

import java.io.Serializable;
import java.util.function.Function;

/**
 * Having 片段
 *
 * @author niliwei
 */
public interface Having<Wrap, R> extends Serializable {
    /**
     * 自定义 having 脚本
     *
     * @param sqlHaving
     * @param params
     * @return
     */
    Wrap having(String sqlHaving, Object... params);

    /**
     * 自定义having条件
     * <p>
     * 例: having(i -> i.le("id", 10).gt("price", 1))
     * 等价于  having id <= 10 and price > 1
     * </p>
     *
     * @param func 函数
     * @return Wrap
     */
    Wrap having(Function<Wrap, Wrap> func);

    /**
     * 自定义having条件
     * <p>
     * 例: havingCount(i -> i.le("id", 10).gt("price", 1))
     * 等价于  having count(id) <= 10 and count(price) > 1
     * </p>
     *
     * @param func 函数
     * @return Wrap
     */
    Wrap havingCount(Function<Wrap, Wrap> func);

    /**
     * 自定义having条件
     * <p>
     * 例: havingMax(i -> i.le("id", 10).gt("price", 1))
     * 等价于  having max(id) <= 10 and max(price) > 1
     * </p>
     *
     * @param func 函数
     * @return Wrap
     */
    Wrap havingMax(Function<Wrap, Wrap> func);

    /**
     * 自定义having条件
     * <p>
     * 例: havingMin(i -> i.le("id", 10).gt("price", 1))
     * 等价于  having min(id) <= 10 and min(price) > 1
     * </p>
     *
     * @param func 函数
     * @return Wrap
     */
    Wrap havingMin(Function<Wrap, Wrap> func);

    /**
     * 自定义having条件
     * <p>
     * 例: havingAvg(i -> i.le("id", 10).gt("price", 1))    ---- id < 10 and  price > 1
     * 等价于  having avg(id) <= 10 and avg(price) > 1
     * </p>
     *
     * @param func 函数
     * @return Wrap
     */
    Wrap havingAvg(Function<Wrap, Wrap> func);

    /**
     * 自定义having条件
     * <p>
     * 例: havingSum(i -> i.le("id", 10).gt("price", 1))
     * 等价于  having sum(id) <= 10 and sum(price) > 1
     * </p>
     *
     * @param func 函数
     * @return Wrap
     */
    Wrap havingSum(Function<Wrap, Wrap> func);


}
